package pers.amos.eshop.advance.product.mq;

import cn.hutool.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import pers.amos.eshop.advance.product.common.RabbitQueueConstants;

/**
 * @author amos wong
 * @create 2020-12-15 8:13 下午
 */
@Component
public class RabbitMQSender {

    @Autowired
    private AmqpTemplate mqTemplate;

    /**
     * 商品的基本信息（除了价格或者库存外）都是时效性低的数据
     * 所以当商品的基本信息修改时，将其发送至 MQ 慢慢消费
     *
     * @param topic   主题
     * @param message 商品信息，json 格式
     */
    @RabbitHandler
    public void send(String topic, String message) {
        mqTemplate.convertAndSend(topic, message);
    }

    public static String buildSendData(String eventType, String dataType, Long id) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.set("event_type", eventType);
        jsonObject.set("data_type", dataType);
        jsonObject.set("id", id);

        return jsonObject.toString();
    }

    /**
     * 构建 product_specification、product_intro、product_specification 三个维度的消息
     * 这三种维度的数据需要传入 productId 以方便后面进行数据聚合
     *
     * @param eventType 事件类型：add、update、delete
     * @param dataType  数据的类型
     * @param id
     * @param productId 关联的商品id，用于聚合数据
     * @return
     */
    public static String buildProductDimData(String eventType, String dataType, Long id, Long productId) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.set("event_type", eventType);
        jsonObject.set("data_type", dataType);
        jsonObject.set("id", id);
        jsonObject.set("product_id", productId);

        return jsonObject.toString();
    }

    /**
     * 决定发送给哪一个消息队列
     *
     * @param operationType
     * @return
     */
    public String decideSendMegQueue(String operationType) {
        String queue = RabbitQueueConstants.DATA_CHANGE_QUEUE;
        if (StringUtils.isNotEmpty(operationType)) {
            switch (operationType) {
                case "high":
                    queue = RabbitQueueConstants.HIGH_PRIORITY_QUEUE;
                    break;
                case "refresh":
                    queue = RabbitQueueConstants.REFRESH_DATA_QUEUE;
                    break;
                default:
                    break;
            }
        }

        return queue;
    }
}
